<?php
/**
 * 替换文档示例
 * Created by PhpStorm.
 * User: bimUser
 * Date: 2018/1/20
 * Time: 13:13
 */

require 'config.php';
require 'vendor/autoload.php';

// 实例化连接
$db = new MongoDB\Client("mongodb://{$cnf['USERNAME']}:{$cnf['PASSWD']}@{$cnf['HOST']}:{$cnf['PORT']}/{$cnf['DBNAME']}");

// 替换文件
// 替换操作与更新操作相似，但替换操作不是将文档更新为包含新字段或新字段值，而是使用新文档替换整个文档，但保留原始文档的_id值。
// 重要！！！替换操作替换文档中除该_id值之外的所有字段 。
// 为避免意外覆盖或删除所需字段，请使用MongoDB\Collection::updateOne()或 MongoDB\Collection::updateMany()方法，
// 更新文档中的单个字段，而不是替换整个文档。
$collection = $db->test->users;
$collection->drop();

$collection->insertOne(['name' => 'Bob', 'state' => 'ny']);
$updateResult = $collection->replaceOne(
    ['name' => 'Bob'],
    ['name' => 'Robert', 'state' => 'ca']
);

printf("Matched %d document(s)\n", $updateResult->getMatchedCount());
printf("Modified %d document(s)\n", $updateResult->getModifiedCount());


// UPSERT
// 更新和替换操作支持一个upsert选项。什么时候upsert是true ，没有文件匹配指定的过滤器，操作创建一个新的文件，并插入它。
// 如果有匹配的文档，那么操作修改或替换匹配的文件或文件。
$collection = $db->test->users;
$collection->drop();

$updateResult = $collection->updateOne(
    ['name' => 'Bob'],
    ['$set' => ['state' => 'ny']],
    ['upsert' => true]
);

printf("Matched %d document(s)\n", $updateResult->getMatchedCount());
printf("Modified %d document(s)\n", $updateResult->getModifiedCount());
printf("Upserted %d document(s)\n", $updateResult->getUpsertedCount());

$upsertedDocument = $collection->findOne([
    '_id' => $updateResult->getUpsertedId(),
]);

var_dump($upsertedDocument);
